package com.ynet.middleground.approve.service;

import java.util.List;

import javax.validation.Valid;

import com.ynet.core.common.ServiceResult;
import com.ynet.middleground.approve.bean.*;
import com.ynet.middleground.approve.dto.HistoryTaskDTO;
import com.ynet.middleground.approve.dto.ProcessInstanceDTO;

/**
 * @author liulx
 * @description 流程实例接口服务类
 * @date 2019/10/11 14:04
 */
public interface ProcessInstanceService {

    /**
     * 挂起或激活指定流程的实例
     *
     * @param req 流程信息请求对象: {流程实例id, 激活挂起标志}
     * @return 挂起或激活标志,以success 字段值标识 true/false
     */
    ServiceResult suspendOrActiveProcessInstance(@Valid ActivateProcessInstanceReq req);

    /**
     * 根据流程实例ID查询流程是否结束
     * 
     * @param req 流程信息请求对象: {流程实例id}
     * @return 流程对象，如果是空，则结束; 非空, 未结束
     */
    ServiceResult<ProcessInstanceDTO> isFinishProcess(@Valid ProcessInstanceReq req);

    /**
     * 根据发起人查询用户发起的未结束的流程列表
     * 
     * @param req 流程信息请求对象: {流程发起人}
     * @return 由用户发起的未结束的流程列表
     */
    ServiceResult<List<ProcessInstanceDTO>> listUnfinishedProcessByStartUserId(@Valid QueryRunningProcessReq req);

    /**
     * 判断用户是否参与了未结束的流程(包括用户发起的流程、需要用户正在审核的流程)
     * 
     * @param req 流程信息请求对象: {流程发起人}
     * @return 结果标志: true/false
     */
    ServiceResult<Boolean> isJoinUnfinishedProcess(@Valid QueryRunningProcessReq req);

    /**
     * 启动流程-通过流程定义Key(模板ID) 、业务Key启动流程
     * 
     * @param startProcessInstanceReq 启动流程请求对象: {流程定义Key, 发起人, 关联业务, 参数}
     * @return 流程实例ID
     */
    ServiceResult<String> startProcessInstance(@Valid StartProcessInstanceReq startProcessInstanceReq);

    /**
     * 作废流程，利用删除流程实例实现
     * 
     * @param cancelProcessReq 作废流程请求对象: {流程实例ID, 作废原因}
     * @return 作废结果标志,以success 字段值标识 true/false
     */
    ServiceResult cancelProcess(@Valid CancelProcessReq cancelProcessReq);

    /**
     * 检查用户是否启动某一个流程
     * 
     * @param processReq 用户是否重复启动某一流程请求对象
     * @return 是否启动标志,以 success 字段值标识 true/false
     */
    ServiceResult checkRepeatStartProcess(@Valid QueryRepeatStartProcessReq processReq);

    /**
     * 根据流程实例ID查询流程任务处理记录
     * 
     * @param processReq 流程信息请求对象: {流程实例id}
     * @return 流程任务走向记录列表
     */
    ServiceResult<List<HistoryTaskDTO>> listHistoryTaskByProcessInstanceId(@Valid ProcessInstanceReq processReq);

    /**
     * 根据流程主体人查询是否有在途流程
     *
     * @param req 查询业务客户是否有未结束的流程请求参数
     * @return 是否有在途流程标志,以 success 字段值标识 true/false
     */
    ServiceResult<Object> listProcessInstanceByBusinessUserId(@Valid QueryBusinessUserRunningProcessReq req);

    /**
     * 更改流程优先级
     *
     * @param req 更改流程优先级请求参数
     * @return 以 success 字段值标识 true: 修改成功/false: 修改失败
     */
    ServiceResult<Object> updateProcessPriority(@Valid PriorityReq req);

}
